package effectiveJava.Reference;

import org.junit.Test;

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

/**
 * Created by dycong on 2017/7/23.
 */
public class Phantom {
    /**
     * 虚引用永远无法使用 get() 方法取得对象的强引用从而访问目标对象。
     * 虚引用所指向的对象在被系统内存回收前，虚引用自身会被放入 ReferenceQueue 对象中从而跟踪对象垃圾回收。
     * 虚引用不会根据内存情况自动回收目标对象。
     *
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
        ReferenceQueue<ObjectForTest> queue = new ReferenceQueue<>();
        PhantomReference<ObjectForTest> bean = new PhantomReference<>(new ObjectForTest(), queue);
        System.out.println(bean.get());
        System.out.println("queue 0 " + queue.poll());
        System.gc();
        System.out.println("queue 1 " + queue.poll());
        Thread.sleep(1000l);
        System.out.println("queue 2 " + queue.poll());
        System.gc();
        System.out.println("queue 3 " + queue.poll());
        System.out.println(bean.get());
        System.out.println("queue 4 " + queue.poll());
    }
}
